package com.ruoyi.web.controller.tool.designpattern.behavioralPatterns.chainOfResponsibility;

/**
 * TODO
 *
 * @author Hack2003
 * @date 2024/3/21 9:48
 **/
// Handler接口
 interface Handler {
    void setNextHandler(Handler nextHandler);
    void handleRequest(int request);
}

// 具体处理者A类
 class ConcreteHandlerA implements Handler {
    private Handler nextHandler;

    @Override
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(int request) {
        if (request < 10) {
            System.out.println("具体处理者A处理请求：" + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

// 具体处理者B类
 class ConcreteHandlerB implements Handler {
    private Handler nextHandler;

    @Override
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    @Override
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("具体处理者B处理请求：" + request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
}

/**
 * 在这个例子中，
 * 我们有两个具体处理者类（ ConcreteHandlerA 和 ConcreteHandlerB ）实现了 Handler 接口。
 * 客户端设置了一个处理链，其中 ConcreteHandlerA 后跟 ConcreteHandlerB 。
 * 每个处理者根据特定条件决定是否处理请求或将请求传递给处理链中的下一个处理者。
 */
public class Test {
    public static void main(String[] args) {
        //处理者A
        Handler handlerA = new ConcreteHandlerA();
        //处理者B
        Handler handlerB = new ConcreteHandlerB();
        //A处理不满足，就去执行B,就像链条一样
        handlerA.setNextHandler(handlerB);

        // 因为A里面有B,所以可以A处理不满足B处理
        handlerA.handleRequest(5);
        handlerA.handleRequest(12);
        handlerA.handleRequest(25);

    }
}